/**
 * 根据权限控制访问方法
 */

{
	const userState = {
		username: 'Jimmy',
		isLogin: true,
		power: ['store'], // 权限列表
	}
	const AccessCross = (powerList: string[]): MethodDecorator => {
		return (
			target: Object,
			propertyKey: string | symbol,
			descriptor: PropertyDescriptor
		) => {
			const method = descriptor.value

			const validate = () => {
				/**
				 * 验证方法 -- 判断一个数组中是否含有另外的数组
				 *  这里使用了数组的 every方法  every方法返回的是布尔值 会每个值都遍历一遍 都为true 才会为true
				 */
				return powerList.every(item => userState.power.includes(item))
			}

			descriptor.value = () => {
				if (userState.isLogin && validate()) {
					method()
					return
				}
				console.log('权限不足')
			}
		}
	}

	class User {
		/**
		 * 保存文章需要登录才能操作
		 */
		@AccessCross(['store'])
		public store() {
			console.log('保存文章')
		}
		public watch() {
			console.log('阅读文章')
		}
	}

	new User().store()
}
